// https://www.programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
// https://leetcode.cn/problems/spiral-matrix-ii/description/

const generateMatrix = function (n) {
  if (!n) return;
  const res = new Array(n).fill(0).map(() => new Array(n).fill(0));
  let startX = (startY = 0);
  let loop = Math.floor(n / 2); // 旋转圈数
  let mid = Math.floor(n / 2); // 中间位置
  let offset = 1; // 控制每一层填充元素个数
  let count = 1; // 更新填充数字
  while (loop) {
    let row = startX,
      col = startY;

    while (col < n - offset) {
      res[row][col] = count;
      count++;
      col++;
    }

    while (row < n - offset) {
      res[row][col] = count;
      count++;
      row++;
    }

    while (col > startX) {
      res[row][col] = count;
      count++;
      col--;
    }

    while (row > startY) {
      res[row][col] = count;
      count++;
      row--;
    }
    startX++;
    startY++;
    offset++;
    loop--;
  }
  // 如果n为奇数的话，需要单独给矩阵最中间的位置赋值
  if (n % 2 === 1) {
    res[mid][mid] = count;
  }
  return res;
};

console.log(JSON.stringify(generateMatrix(3)));

// var generateMatrix = function(n) {
//   let startX = startY = 0;   // 起始位置
//   let loop = Math.floor(n/2);   // 旋转圈数
//   let mid = Math.floor(n/2);    // 中间位置
//   let offset = 1;    // 控制每一层填充元素个数
//   let count = 1;     // 更新填充数字
//   let res = new Array(n).fill(0).map(() => new Array(n).fill(0));

//   while (loop--) {
//       let row = startX, col = startY;
//       // 上行从左到右（左闭右开）
//       for (; col < n - offset; col++) {
//           res[row][col] = count++;
//       }
//       // 右列从上到下（左闭右开）
//       for (; row < n - offset; row++) {
//           res[row][col] = count++;
//       }
//       // 下行从右到左（左闭右开）
//       for (; col > startY; col--) {
//           res[row][col] = count++;
//       }
//       // 左列做下到上（左闭右开）
//       for (; row > startX; row--) {
//           res[row][col] = count++;
//       }

//       // 更新起始位置
//       startX++;
//       startY++;

//       // 更新offset
//       offset += 1;
//   }
//   // 如果n为奇数的话，需要单独给矩阵最中间的位置赋值
//   if (n % 2 === 1) {
//       res[mid][mid] = count;
//   }
//   return res;
// };
